package com.mars.admin.modules.post.service;

import com.mars.admin.modules.base.service.BaseService;
import com.mars.admin.modules.post.entity.PostComment;
import com.mars.admin.modules.post.vo.PostConmentVO;
import com.mybatisflex.core.paginate.Page;

import java.util.List;

/**
 * 帖子评论服务接口
 *
 * @author Mars
 * @version 1.0
 * @date 2025-01-07
 */
public interface IPostCommentService extends BaseService<PostComment> {

    /**
     * 发布评论
     *
     * @param comment 评论信息
     * @return 是否成功
     */
    boolean publishComment(PostComment comment);

    /**
     * 回复评论
     *
     * @param comment 评论信息
     * @param parentId 父评论ID
     * @param replyUserId 被回复用户ID
     * @return 是否成功
     */
    boolean replyComment(PostComment comment, Long parentId, Long replyUserId);

    /**
     * 删除评论
     *
     * @param commentId 评论ID
     * @return 是否成功
     */
    boolean deleteComment(Long commentId);

    /**
     * 根据帖子ID查询评论列表
     *
     * @param postId 帖子ID
     * @param page 分页参数
     * @return 评论列表
     */
    Page<PostComment> getCommentsByPostId(Long postId, Page<PostComment> page);

    /**
     * 根据用户ID查询评论列表
     *
     * @param userId 用户ID
     * @param page 分页参数
     * @return 评论列表
     */
    Page<PostComment> getCommentsByUserId(Long userId, Page<PostComment> page);

    /**
     * 根据父评论ID查询子评论列表
     *
     * @param parentId 父评论ID
     * @param page 分页参数
     * @return 子评论列表
     */
    Page<PostComment> getCommentsByParentId(Long parentId, Page<PostComment> page);

    /**
     * 查询热门评论
     *
     * @param postId 帖子ID
     * @param limit 限制数量
     * @return 热门评论列表
     */
    List<PostComment> getHotComments(Long postId, Integer limit);

    /**
     * 查询最新评论
     *
     * @param postId 帖子ID
     * @param limit 限制数量
     * @return 最新评论列表
     */
    List<PostComment> getLatestComments(Long postId, Integer limit);

    /**
     * 审核评论
     *
     * @param commentId 评论ID
     * @param auditStatus 审核状态
     * @param auditReason 审核原因
     * @param auditUserId 审核人ID
     * @return 是否成功
     */
    boolean auditComment(Long commentId, Integer auditStatus, String auditReason, Long auditUserId);

    /**
     * 设置评论置顶状态
     *
     * @param commentId 评论ID
     * @param isTop 是否置顶
     * @return 是否成功
     */
    boolean setCommentTop(Long commentId, Integer isTop);

    /**
     * 统计帖子的评论数量
     *
     * @param postId 帖子ID
     * @return 评论数量
     */
    int countCommentsByPostId(Long postId);

    /**
     * 统计用户的评论数量
     *
     * @param userId 用户ID
     * @return 评论数量
     */
    int countCommentsByUserId(Long userId);

    /**
     * 统计父评论的子评论数量
     *
     * @param parentId 父评论ID
     * @return 子评论数量
     */
    int countCommentsByParentId(Long parentId);

    /**
     * 更新评论点赞数
     *
     * @param commentId 评论ID
     * @param increment 增量
     * @return 是否成功
     */
    boolean updateCommentLikeCount(Long commentId, Integer increment);

    /**
     * 更新评论回复数
     *
     * @param commentId 评论ID
     * @param increment 增量
     * @return 是否成功
     */
    boolean updateCommentReplyCount(Long commentId, Integer increment);

    /**
     * 查询待审核的评论
     *
     * @param page 分页参数
     * @return 待审核评论列表
     */
    Page<PostComment> getPendingAuditComments(Page<PostComment> page);

    /**
     * 批量删除评论
     *
     * @param commentIds 评论ID列表
     * @return 是否成功
     */
    boolean batchDeleteComments(List<Long> commentIds);

    /**
     * 根据帖子ID删除所有评论
     *
     * @param postId 帖子ID
     * @return 是否成功
     */
    boolean deleteCommentsByPostId(Long postId);

    Page<PostConmentVO> pagePostComment(Page<PostConmentVO> page, Long postId, Long userId, Long parentId, Integer status, Integer isTop);

    PostConmentVO getPostCommentWithUserById(Long id);
}